package com.yf.exam.modules.user.repo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yf.exam.core.api.dto.BaseIdReqDTO;
import com.yf.exam.modules.qu.entity.QuRepo;
import com.yf.exam.modules.qu.mapper.QuRepoMapper;
import com.yf.exam.modules.user.repo.dto.request.UserRepoReqDTO;
import com.yf.exam.modules.user.repo.entity.UserRepo;
import com.yf.exam.modules.user.repo.mapper.UserRepoMapper;
import com.yf.exam.modules.user.repo.service.UserRepoService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 用户题库业务实现类
 */
@Service
public class UserRepoServiceImpl extends ServiceImpl<UserRepoMapper, UserRepo> implements UserRepoService {

    @Autowired
    private UserRepoMapper userRepoMapper;
    
    @Autowired
    private QuRepoMapper quRepoMapper;

    @Override
    public BaseIdReqDTO startTrain(UserRepoReqDTO reqDTO) {
        try {
            // 检查是否已存在相同的用户ID和题库ID组合
            QueryWrapper<UserRepo> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda()
                .eq(UserRepo::getUserId, reqDTO.getUserId())
                .eq(UserRepo::getRepoId, reqDTO.getRepoId());
            
            UserRepo existingUserRepo = this.getOne(queryWrapper);
            
            if (existingUserRepo != null) {
                // 如果记录已存在，更新模式和时间戳
                existingUserRepo.setMode(reqDTO.getMode());
                existingUserRepo.setUpdateTime(new java.util.Date());
                this.updateById(existingUserRepo);
                
                // 返回现有记录的ID
                BaseIdReqDTO respDTO = new BaseIdReqDTO();
                respDTO.setId(existingUserRepo.getId());
                return respDTO;
            }
            
            // 创建新的用户题库记录
            UserRepo userRepo = new UserRepo();
            BeanUtils.copyProperties(reqDTO, userRepo);
            userRepo.setCreateTime(new java.util.Date());
            userRepo.setUpdateTime(new java.util.Date());
            
            // 如果用户ID为空，设置默认值
            if (!StringUtils.hasText(userRepo.getUserId())) {
                userRepo.setUserId("default_user");
            }
            
            // 如果题库ID为空，抛出异常
            if (!StringUtils.hasText(userRepo.getRepoId())) {
                throw new IllegalArgumentException("题库ID不能为空");
            }
            
            // 保存记录
            this.save(userRepo);
            
            // 返回ID
            BaseIdReqDTO respDTO = new BaseIdReqDTO();
            respDTO.setId(userRepo.getId());
            return respDTO;
        } catch (Exception e) {
            throw new RuntimeException("创建用户题库记录失败: " + e.getMessage(), e);
        }
    }
    
    @Override
    public BaseIdReqDTO nextQu(UserRepoReqDTO reqDTO) {
        try {
            // 获取用户题库记录
            UserRepo userRepo = this.getById(reqDTO.getRepoId());
            if (userRepo == null) {
                throw new IllegalArgumentException("用户题库记录不存在");
            }
            
            // 查询该题库下的所有题目，按排序字段排序
            QueryWrapper<QuRepo> wrapper = new QueryWrapper<>();
            wrapper.lambda()
                .eq(QuRepo::getRepoId, userRepo.getRepoId())
                .orderByAsc(QuRepo::getSort);
            List<QuRepo> quRepos = quRepoMapper.selectList(wrapper);
            
            if (quRepos == null || quRepos.isEmpty()) {
                throw new IllegalArgumentException("题库中没有题目");
            }
            
            // 如果没有提供当前题目ID，则返回第一题
            if (StringUtils.isEmpty(reqDTO.getSequence())) {
                QuRepo firstQu = quRepos.get(0);
                BaseIdReqDTO respDTO = new BaseIdReqDTO();
                respDTO.setId(firstQu.getQuId());
                return respDTO;
            }
            
            // 根据当前题目ID查找下一题
            String currentQuId = reqDTO.getSequence();
            for (int i = 0; i < quRepos.size() - 1; i++) {
                if (quRepos.get(i).getQuId().equals(currentQuId)) {
                    // 返回下一题
                    QuRepo nextQu = quRepos.get(i + 1);
                    BaseIdReqDTO respDTO = new BaseIdReqDTO();
                    respDTO.setId(nextQu.getQuId());
                    return respDTO;
                }
            }
            
            // 如果是最后一题，返回null表示没有更多题目
            BaseIdReqDTO respDTO = new BaseIdReqDTO();
            respDTO.setId(null);
            return respDTO;
        } catch (Exception e) {
            BaseIdReqDTO respDTO = new BaseIdReqDTO();
            respDTO.setId(null);
            return respDTO;
        }
    }
}